The release by Sun Microsystems in 1994 of the Java programming language marked the first wide scale release of a software system based upon virtual machines. The virtual machine abstracted much of the details of the underlying operating system. Java software is compiled into a bytecode format, which is compiled into machine code of the local machine at runtime. These features allowed for easy portability of programs written in Java between computers running different operating systems.
However, it also made the task of interacting with other software written for that operating system more difficult. The primary method that Java provided for interacting with software running outside its virtual machine was through a function called the Java Native Interface (JNI). JNI allows a Java program running inside the Java Virtual Machine (JVM) to access any resources on the local machine by utilizing standard operating system facilities.
The success of the Java programming language spawned other languages utilizing the virtual machine model. The most widely used of these competitors is the .NET Framework written by Microsoft Corporation. The .NET framework also allows for programs to be written in multiple Microsoft programming environments that are compiled into a shared bytecode format. This bytecode is then interpreted by the .NET virtual machine and any actions are executed.
Both .NET and Java are also object oriented programming languages. In order to form fully function programs, a programmer writes objects and then assembles objects together. Unfortunately, even though both .NET and Java are objected oriented languages that use virtual machine systems, the objects created in each cannot be directly used in the other virtual machine. That is, objects in .NET and Java are not interoperable with each other. Thus, programmers must write objects for use in .NET and Java separately. Providing support for objects across multiple languages is well known to be difficult and expensive.
Some development has taken place to write a common virtual machine for both languages. However, such an implementation may not be supported by either Sun or Microsoft. Because of its lack of support, this dual virtual machine has significant performance and stability issues. Furthermore, the task of fully implementing a virtual machine to handle both programming languages is a very expansive task because of the need to completely handle the specification of both programming languages and their differences.
Another option for sharing objects created in one virtual machine with the other virtual machine is through the use of intermediary proxies. With this technique, both virtual machines run concurrently, with the proxies handling details of the object management for the opposing virtual machine. This management of objects between the virtual machines was generally accomplished through the use of a third system that was already known by both virtual machines.
For example, a heavy-weight Common Object Request Broker Architecture (CORBA) proxy was created to handle the creation, modification, and destruction of objects on the opposing virtual machine. The proxy format utilized by this third system, however, had significant drawbacks. The virtual machines had to translate their data into the CORBA format for communication with the other virtual machine. In addition, the stability and performance of the CORBA framework limited the use of this proxy.
Therefore, there exists a need for a software system that allows for easy, efficient interoperability between implementations of object oriented, virtual machine languages, such as .NET and Java. There also is a need for implementing an improved proxy, such as a lightweight and/or stable proxy, that allows the use of objects written for one type of virtual machine to be utilized by a software program running in a different type of virtual machine.